parser grammar TemplatingParser;

options {
	language=CSharp;
	tokenVocab = TemplatingLexer;
}

@lexer::namespace {
	Templating.Grammar.Antlr
}

portal
	:	part+
	;

part
    :   TOKEN_EXPR              # expr
    |   TOKEN_PARTIAL           # partial
    |   TOKEN_OTHER             # other
    |   foreachExpr             # foreach
    |   TOKEN_OP_LBRACKET part+ TOKEN_OP_RBRACE                # parentPart
    ;

foreachExpr
    :   TOKEN_MARK_FOREACH foreachQueryExpr? TOKEN_OP_LBRACE bodyExpr TOKEN_OP_RBRACE
    ;

foreachQueryExpr
    :   TOKEN_OP_LPARENT TOKEN_IDENTIFIER? orderByExpr? groupByExpr? foreachIntoExpr? TOKEN_OP_RPARENT
    ;

foreachIntoExpr
    :   TOKEN_INTO TOKEN_IDENTIFIER
    ;

groupByExpr
    :   TOKEN_GROUPBY TOKEN_OP_LPARENT TOKEN_CONST_STRING orderByExpr? TOKEN_OP_RPARENT
    ;

orderByExpr
    :   TOKEN_ORDERBY TOKEN_OP_LPARENT TOKEN_CONST_STRING TOKEN_OP_RPARENT
    ;

objExpr
	:	TOKEN_OP_LBRACKET bodyExpr TOKEN_OP_RBRACE
	;
	
bodyExpr
    :   part+
	|	(part+)? objExpr (part+)?
    ; 

